package bootstrap

import (
	"flag"
	"log/slog"
	"os"

	"gitee.com/jiebaiyou/formflow/pkg/storage/redis"
	"gitee.com/jiebaiyou/formflow/pkg/storage/sqlite"
)

// Application 应用程序结构体, 包含环境配置和数据库客户端
type Application struct {
	Config *Config      // 环境配置
	DB     sqlite.DB    // SQLite数据库客户端
	Redis  redis.Client // Redis客户端
}

// App 创建并初始化应用程序实例
func App() Application {
	// 设置早期JSON格式日志, 确保在应用初始化前的日志也是JSON格式, 保持日志一致性
	EarlyLogger()

	slog.Info("初始化应用...")

	app := &Application{}

	// 定义命令行参数, 默认加载开发配置文件dev.yaml
	// go run cmd/main.go -config="./config/yaml/prod.yaml"
	ConfigFile := flag.String("config", "config/yaml/dev.yaml", "path to config file")
	// 解析命令行参数
	flag.Parse()

	app.Config = NewConfig(ConfigFile)
	if app.Config == nil {
		slog.Error("初始化配置文件失败")
		os.Exit(1)
	}

	// 初始化日志, 并设置为全局日志记录器, 后期可以根据需要加入到App中
	logger := NewLogger(app.Config)
	if logger == nil {
		slog.Error("初始化日志失败")
		os.Exit(1)
	}

	app.DB = NewSQLiteDatabase(app.Config)
	if app.DB == nil {
		slog.Error("初始化数据库失败")
		os.Exit(1)
	}

	app.Redis = NewRedisDatabase(app.Config)
	if app.Redis == nil {
		slog.Error("初始化Redis失败")
		os.Exit(1)
	}

	slog.Info("应用初始化完成")
	return *app
}

// CloseDBConnection 关闭数据库连接
func (app *Application) CloseDBConnection() {
	slog.Info("关闭数据库连接...")
	CloseSQLiteConnection()
	slog.Info("SQLite连接已关闭")
}

func (app *Application) CloseRedisConnection() {
	slog.Info("关闭Redis连接...")
	CloseRedisConnection(app.Redis)
	slog.Info("Redis连接已关闭")
}
